#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/3/8 17:05
# @Author  : jeff
# @FileName: db_config
from urllib import parse
from flask import Flask
from sqlalchemy.orm import sessionmaker

from src.model.base_model import db
from src.utils.read_config import db_config

host_name, port, username, password, database = db_config()

HOSTNAME = host_name
PORT = port
USERNAME = username
PASSWORD = password
DATABASE = database
pwd = parse.quote_plus(PASSWORD)


def config(app: Flask) -> Flask:
    app.config[
        'SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{pwd}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    app.config['SQLALCHEMY_ECHO'] = True
    app.config['SQLALCHEMY_POOL_RECYCLE'] = 28800
    # 通过 SQLALCHEMY_ENGINE_OPTIONS 传递连接引擎的相关参数
    app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
        # 连接在空闲超过 280 秒后被回收，防止 MySQL 的 wait_timeout 问题
        'pool_recycle': 28800,
        # 连接池的大小（实际连接数会根据并发需求动态创建，但不会超过 pool_size + max_overflow）
        'pool_size': 10,
        # 当连接池中连接耗尽时，允许创建的最大溢出连接数
        'max_overflow': 5,
        # 每次从连接池取连接前会先发送 ping SQL 检查连接是否有效
        'pool_pre_ping': True,
        # 从连接池中取连接时最大的等待时间（单位：秒）
        'pool_timeout': 30,
    }
    # 如果你希望每次提交后实例属性失效，从而确保后续查询获取的是最新数据，
    # 可以设置 SQLALCHEMY_EXPIRE_ON_COMMIT 为 True（默认就是 True）
    app.config['SQLALCHEMY_EXPIRE_ON_COMMIT'] = True
    return app
